"use strict";

module.exports = core;
const path = require("path");
const semver = require("semver");
const colors = require("colors");
const userHome = require("user-home");
const pathExists = require("path-exists").sync;
const pkg = require("../package.json");
const log = require("@hl-imooc-cli-dev/log");
const init = require("@hl-imooc-cli-dev/init");
const exec = require("@hl-imooc-cli-dev/exec");
const constant = require("./const");
const { Command } = require('commander');

let args, config;

// 实例化脚手架
const program = new Command();

async function core() {
  // TODO
  try {
    await prepare()
    registerCommand();
    // log.verbose("debug", "test debug log...");
  } catch (e) {
    log.error(e.message);
    if (program.debug) {
      console.log(e)
    }
  }
}
function registerCommand() {
  program
    .name(Object.keys(pkg.bin)[0])
    .usage("<command> [options]")
    .version('0.0.1')
    .option('-d, --debug', '是否开启调试模式', false)
    .option('-tp, --targetPath <targetPath>', '是否指定本地调试文件路径', '');
  program
    .command('init [projectName]')
    .option('-f --force', '是否强制初始化项目')
    .action(exec)
  // 开启debug模式
  program.on('option:debug', function () {
    console.log('debug', program.opts().debug)
    if (program.opts().debug) {
      process.env.LOG_LEVEL = "verbose";
    } else {
      process.env.LOG_LEVEL = "info"
    }
    log.level = process.env.LOG_LEVEL;
    // log.verbose("test");
  });
  // 指定targetPath
  program.on('option:targetPath', function () {
    process.env.CLI_TARGET_PATH = program.opts().targetPath
  })
  // 对未知的命令监听
  program.on('command:*', function (obj) {
    const availableCommands = program.commands.map(cmd => cmd.name());
    console.log(colors.red('未知的命令：' + obj[0]))
    if (availableCommands.length > 0) {
      console.log('可用的命令：' + availableCommands.join(','))
    }
  });


  program.parse(process.argv);
  // 用户的输入的command参数会被放在args中，如果command参数没有 就打印出帮助信息 
  if (program.args && program.args.length < 1) {
    program.outputHelp()
  }
}

async function prepare() {
  checkPkgVersion();

  checkRoot();
  checkUserHome();
  // checkInputArgs(); Command 更加优雅处理了参数，不需要额外处理了
  checkEnv(); // 用户用户名和密码敏感信息集成在用户本地中
  await checkGlobalUpdate();
}
async function checkGlobalUpdate() {
  // 1,获取当前版本号和模块名
  // 2.调用npm API 获取所有的版本号(https://registry.npmjs.org/包名)
  // 3.提取所有版本号，比对哪些版本号是大于当前版本号
  // 4.获取最新版本号，提示用户更新盖版本号
  const { getNpmSemverVersion } = require("@hl-imooc-cli-dev/get-npm-info");
  const currentVersion = pkg.version;
  const npmName = pkg.name;
  // 通过接口请求拿到最新的版本号
  const lastVersion = await getNpmSemverVersion(currentVersion, npmName);
  // 拿npm上最新的版本号和本地安装的版本号进行对比，如果前者大于后者，则给用户一个明显的提示
  if (lastVersion && semver.gt(lastVersion, currentVersion)) {
    log.warn(
      colors.yellow(`请手动更新${npmName},当前版本:${currentVersion}，最新版本:${lastVersion}
    更新命令 npm install -g ${npmName}
    `)
    );
  }
}
function checkEnv() {
  const dotenv = require("dotenv");
  const dotenvPath = path.resolve(userHome, ".env");
  if (pathExists(dotenvPath)) {
    config = dotenv.config({
      path: dotenvPath
    });
  }
  createDefaultConfig();

  log.info("环境变量", process.env.CLI_HOME_PATH);
}

function createDefaultConfig() {
  const cliConfig = {
    home: userHome
  };
  if (process.env.CLI_HOME) {
    cliConfig["clihome"] = path.join(userHome, process.env.CLI_HOME);
  } else {
    cliConfig["clihome"] = path.join(userHome, constant.DEFAULT_CLI_HOME);
  }
  process.env.CLI_HOME_PATH = cliConfig.clihome;


}
// function checkInputArgs() {
//   args = require("minimist")(process.argv.slice(2));
//   checkArgs();
// }

// function checkArgs() {
//   if (args.debug) {
//     process.env.LOG_LEVEL = "verbose";
//   } else {
//     process.env.LOG_LEVEL = "info";
//   }
//   log.level = process.env.LOG_LEVEL;
// }

function checkUserHome() {
  if (!userHome || !pathExists(userHome)) {
    throw new Error(colors.red("当前登录用户主目录不存在！"));
  }
}

function checkRoot() {
  const rootCheck = require("root-check");
  rootCheck();
  // console.log(process.geteuid());
}


function checkPkgVersion() {
  log.info("hl imooc cli 版本", pkg.version);
}
